# -*- coding: utf-8 -*-
import os
import pandas as pd
import requests
import json
import time
import re
import shutil
from openpyxl import load_workbook
from openai import OpenAI

client = OpenAI(api_key="sk-b6ae6c7c2ae74c01ae26d7d8ae7a503e", base_url="https://api.deepseek.com")


# DeepSeek API 调用函数
def call_deepseek_api(content, theme, background):
    """
    调用 DeepSeek API 判断 content 是否与 theme 相关
    :param content: 需要判断的文本内容
    :param theme: 主题
    :param background: 主题的背景信息
    :return: 相关返回 "相关"，不相关返回 "不相关"
    """
    # 构造 prompt
    prompt = f"""
    主题背景：{background}
    主题：{theme}
    任务：判断以下内容是否与主题背景相关。如果相关，请返回一个 JSON，格式为 {{"relate": "相关"}}；如果不相关，请返回一个 JSON，格式为 {{"relate": "不相关"}}。
    内容：{content}
    """

    try:
        # 调用 DeepSeek API
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[
                {"role": "system", "content": "你是一个帮助判断内容相关性的助手。"},
                {"role": "user", "content": prompt},
            ],
            stream=False
        )
        # 提取返回结果
        result = response.choices[0].message.content.strip()
        print("-------------")
        print(prompt)
        print(result)
        print("-------------")

        # 解析 JSON
        result_json = json.loads(result)
        relate_value = result_json.get("relate", "不相关")  # 如果解析失败或没有 "relate" 字段，默认返回 "不相关"
        return relate_value if relate_value in ["相关", "不相关"] else "不相关"  # 确保返回值为 "相关" 或 "不相关"
    except json.JSONDecodeError as je:
        print(f"JSON 解析失败: {je}")
        return "不相关"
    except Exception as e:
        print(f"调用 DeepSeek API 出错: {e}")
        return "不相关"  # 默认返回 "不相关"



def remove_hashtags(text):
    """
    移除文本中的 ## 包裹的内容
    :param text: 原始文本
    :return: 清理后的文本
    """
    try:
        text = re.sub(r'##([^#]+)##', '', text)
    except Exception as e:
        text = ""
    return text

def main():
    # 定义主题和背景信息
    theme = "姜萍数学竞赛违规事件"  # 替换为你的主题
    background = """
    2024年6月，17岁中专生姜萍以第12名成绩入围阿里巴巴全球数学竞赛决赛，引发“草根逆袭”热潮，但随后被质疑作弊。11月3日，组委会调查确认其数学老师王某某在预选赛中违规提供帮助，违反“禁止与他人讨论”规则，二人成绩被取消。阿里巴巴全球数学竞赛组委会公开道歉，承认赛事制度不完善，承诺加强管理，并删除相关视频以消除误导。涟水中专对王某某进行诫勉谈话并取消其评优资格。事件暴露了赛制漏洞、媒体过度渲染及公众对“逆袭”故事的盲目追捧，姜萍则成为舆论风暴的中心，经历从“造神”到“毁神”的跌宕起伏。
    """  # 替换为你的主题背景信息

    # 文件路径
    from_path = './dic2/comment11.xlsx'  # 输入文件路径
    to_path = "./dic2/hxjTest_cleaned_1.xlsx"  # 备份文件路径

    # 读取需要处理的 Excel 文件
    df = pd.read_excel(from_path)

    # 新增一列 "相关性"，默认值为 "不相关"
    df["相关性"] = "不相关"

    # 初始化计数器
    count = 0

    # 每隔多少条数据备份一次
    backup_interval = 50

    # 遍历每一行数据
    for index, row in df.iterrows():
        content = remove_hashtags(row["content"])

        # 检查 content 是否与主题相关
        if len(content) >= 10:  # 只处理长度大于等于 10 的 content
            try:
                related = call_deepseek_api(content, theme, background)  # 传递背景信息
                df.at[index, "相关性"] = related
            except Exception as e:
                print(f"处理 content 出错: {e}")
                df.at[index, "相关性"] = "不相关"

        # 每处理完一条数据，计数器加1
        count += 1

        # 每处理完 10 条数据保存一次
        if count % 10 == 0:
            df.to_excel(from_path, index=False)
            print(f"已保存到文件，当前处理到第 {index} 行")

        # 每隔 backup_interval 条数据备份一次
        if count % backup_interval == 0:
            os.makedirs(os.path.dirname(to_path), exist_ok=True)
            shutil.copy(from_path, to_path)
            print(f"已备份到 {to_path}，当前处理到第 {index} 行")

    # 最后保存一次，确保所有数据都被保存到文件中
    df.to_excel(from_path, index=False)
    print("处理完成，文件已保存")

if __name__ == "__main__":
    main()